#ifndef NET_H
#define NET_H

#include <QObject>
#include <QVector>
class QBitArray;

/** Нейросеть
 *
 * @author Василий Почкаенко
 */
class Net : public QObject{
Q_OBJECT
private:
	/** Кол-во строк в матрице.*/
	int RowCount;

	/** Кол-во столбцов в матрице.*/
	int ColumnCount;

	/** Передано необходимое кол-во картинок или нет.*/
	bool IsInit;

	/** Кол-во нейронов.*/
	int QuantityNeurons;

	/** Инициализирующие картинки.*/
	QList<QBitArray > * imgs;

	/** Символы инициализирующих картинок.*/
	QList<QChar> chars;

	double e;

	/** Весовые коэффициенты первого слоя.*/
	QVector<QVector<double> > w1;

	/** Аксоны первого слоя.*/
	QVector<double> y1;

	/** Аксоны второго слоя.*/
	QVector<double> y2;

	/** Состояния нейронов второго слоя.*/
	QVector<double> s2;

	double T;

	/** Высота порога активаци.*/
	double F;

	int MaxIter;

	/** Очистить.*/
	inline void clear();

	/** Инициализация сети переданными картинками.*/
	inline void init();
public:
	explicit Net(int rowCount, int columnCount, int quantityNeurons, QObject *parent = 0);

	~Net();

	/** Кол-во строк в матрице.*/
	int rowCount() const;

	/** Кол-во столбцов в матрице.*/
	int columnCount() const;

	/** Передано необходимое кол-во картинок или нет.*/
	bool isInit() const;

	/** Кол-во нейронов.*/
	int quantityNeurons() const;

	/** Найти наиболее подходящий символ.*/
	QChar inquire(const QBitArray & img);
signals:

public slots:	
	/** Задать кол-во строк в матрице.*/
	void setRowCount(int n);

	/** Задать кол-во столбцов в матрице.*/
	void setColumnCount(int n);

	/** Задать кол-во нейронов.*/
	void setQuantityNeurons(int n);

	/**Добавить картинку.*/
	void addImage(const QBitArray & img, const QChar c);
};

#endif // NET_H
